/**
 * 验证码服务
 * 提供短信验证码的生成、发送、验证和生命周期管理功能
 * 
 * 功能特性：
 * - 6位随机验证码生成
 * - 5分钟有效期管理
 * - 一次性使用验证码
 * - 自动过期清理
 * - 详细的日志记录
 */

// 验证码存储接口
interface VerificationCode {
  phoneNumber: string;  // 手机号
  code: string;         // 验证码
  timestamp: number;    // 生成时间戳
  expiresAt: number;    // 过期时间戳
}

// 存储验证码的Map（在实际项目中应该使用数据库或Redis）
const verificationCodes = new Map<string, VerificationCode>();

// 验证码有效期（5分钟）
const CODE_EXPIRY_TIME = 5 * 60 * 1000;

/**
 * 生成6位随机验证码
 * 使用Math.random()生成100000-999999之间的随机数
 * 
 * @returns 6位数字验证码字符串
 */
export const generateVerificationCode = (): string => {
  return Math.floor(100000 + Math.random() * 900000).toString();
};

/**
 * 发送验证码
 * 生成验证码并存储，在实际项目中应该通过短信服务发送
 * 
 * @param phoneNumber 手机号
 * @returns 生成的验证码（开发环境返回，生产环境不返回）
 */
export const sendVerificationCode = (phoneNumber: string): string => {
  // 生成验证码
  const code = generateVerificationCode();
  const now = Date.now();
  
  // 存储验证码信息
  const verificationCode: VerificationCode = {
    phoneNumber,
    code,
    timestamp: now,
    expiresAt: now + CODE_EXPIRY_TIME
  };
  
  // 保存到Map中，以手机号为键
  verificationCodes.set(phoneNumber, verificationCode);
  
  // 打印到后台（开发环境使用）
  console.log('=== 验证码发送日志 ===');
  console.log('手机号:', phoneNumber);
  console.log('验证码:', code);
  console.log('发送时间:', new Date(now).toLocaleString());
  console.log('过期时间:', new Date(verificationCode.expiresAt).toLocaleString());
  console.log('=====================');
  
  return code;
};

/**
 * 验证验证码
 * 检查验证码是否存在、是否过期、是否匹配
 * 
 * @param phoneNumber 手机号
 * @param inputCode 用户输入的验证码
 * @returns 验证结果
 */
export const verifyCode = (phoneNumber: string, inputCode: string): boolean => {
  const storedCode = verificationCodes.get(phoneNumber);
  
  // 检查验证码是否存在
  if (!storedCode) {
    console.log('验证码不存在');
    return false;
  }
  
  // 检查是否过期
  if (Date.now() > storedCode.expiresAt) {
    console.log('验证码已过期');
    verificationCodes.delete(phoneNumber); // 删除过期验证码
    return false;
  }
  
  // 检查验证码是否匹配
  const isValid = storedCode.code === inputCode;
  
  console.log('=== 验证码验证日志 ===');
  console.log('手机号:', phoneNumber);
  console.log('存储的验证码:', storedCode.code);
  console.log('输入的验证码:', inputCode);
  console.log('验证结果:', isValid ? '成功' : '失败');
  console.log('验证时间:', new Date().toLocaleString());
  console.log('=====================');
  
  // 验证成功后删除验证码，防止重复使用
  if (isValid) {
    verificationCodes.delete(phoneNumber);
  }
  
  return isValid;
};

/**
 * 获取验证码信息（用于调试）
 * 
 * @param phoneNumber 手机号
 * @returns 验证码信息或undefined
 */
export const getVerificationCodeInfo = (phoneNumber: string) => {
  return verificationCodes.get(phoneNumber);
};

/**
 * 清理过期的验证码
 * 定期清理过期的验证码，释放内存
 */
export const cleanupExpiredCodes = () => {
  const now = Date.now();
  for (const [phoneNumber, code] of verificationCodes.entries()) {
    if (now > code.expiresAt) {
      verificationCodes.delete(phoneNumber);
      console.log(`清理过期验证码: ${phoneNumber}`);
    }
  }
};

// 定期清理过期验证码（每分钟执行一次）
setInterval(cleanupExpiredCodes, 60 * 1000); 